/* =============================================================
 * string-utils.js v1.3.0
 * =============================================================
 * Original written by Ysy
 * =============================================================
 * Date 15/06/2020
 * ============================================================ */
import NumberUtils from "@/utils/number-utils";

export default class StringUtils {

  /**
   * @Author Ysy
   * @Description // 判断变量为字符串
   * @Param str
   * @Date 16:49 2022/6/30
   **/
  static isString( str ) {
    // typeof  对于丰富的对象实例只能返回"Object"字符串  例如：typeof [] 返回的是object
    return str && Object.is( "string", typeof str );
  }

  /**
   * @Author Ysy
   * @Description // 判断变量为数字
   * @Param num
   * @Date 16:50 2022/6/30
   **/
  static isNumber( num ) {
    return num && Object.is( "number", typeof num );
  }


  /**
   * @Author Ysy
   * @Description // TODO
   * @Param obj
   * @Date 16:50 2022/6/30
   **/
  static isObject( obj ) {
    return obj && obj instanceof Object;
  }

  /**
   * @Author Ysy
   * @Description // 判断变量为数组
   * @Param arr
   * @Date 16:50 2022/6/30
   **/
  static isArray( arr ) {
    return arr && arr instanceof Array;
  }

  /**
   * @Author Ysy
   * @Description // 字符串非空判定  undefined null "    " 都会认为是空串
   * @Param str
   * @Date 16:35 2022/6/30
   **/
  static isEmpty( str ) {
    // 正则表达式用于判斷字符串是否全部由空格或换行符组成
    let reg = /^\s*$/;
    return !( str && str !== "" && !reg.test( str ) );
  }

  /**
   * @Author Ysy
   * @Description // 字符串非空判定
   * @Param str
   * @Date 16:36 2022/6/30
   **/
  static isNotEmpty( str ) {
    return !this.isEmpty( str );
  }

  /**
   * @Author Ysy
   * @Description // 字符串值是否相等判断  这里不做严格比较
   * @Date 16:38 2022/6/30
   * @param str1
   * @param str2
   **/
  static equals( str1, str2 ) {
    let boolean = false;
    if ( !str1 || !str2 ) return boolean;

    if ( str1 === str2 ) boolean = true;

    return boolean;
  }

  /**
   * @Author Ysy
   * @Description // 将 "{min=0,aver=0.10,max=0.60}"  转为对象
   * @Param str
   * @Date 16:48 2022/6/30
   **/
  static formatToObject( str ) {
    let obj = {};
    if ( !str || !this.isString( str ) ) return obj;

    str = str.replace( "{", "" ).replace( "}", "" );
    str.replace( /(\w+)(?:=([^,]*))?/g, ( str, key, value ) => {
      obj[ key ] = value;
    } );

    return obj;
  }

  /**
   * @Author Ysy
   * @Description // 字符串转数字
   * @Param str  需要转化的字符串   radix  转换进制  10-十进制
   * @param radix
   * @Date 16:48 2022/6/30
   **/
  static toNumber( str, radix ) {// radix:转换进制
    if ( !str || !this.isString( str ) ) return str;

    radix = radix ? radix : 10;// 默认10进制转换
    if ( /^-?\d+$/.test( str ) ) {// 整数
      return Number.parseInt( str, radix );
    } else if ( /^(-?\d+)(\.\d+)?$/.test( str ) ) {// 浮点数
      return Number.parseFloat( str );
    }

    return str;
  }

  /**
   * @Author Ysy
   * @Description // 对一个字符串或数字取整数或小数部分
   * @Param param  需要处理的字符串或数字  type  需要取的部分  int-代表取整数部分  float-代表取小数部分
   * @param type
   * @Date 16:51 2022/6/30
   **/
  static getNumberPart( param, type ) {
    if ( !param ) return "";

    let num = this.isString( param ) ? this.toNumber( param ) : param;
    if ( !this.isNumber( num ) ) return num;

    if ( Object.is( "int", type ) ) {// 取整数部分
      return Math.trunc( num );
    } else if ( Object.is( "float", type ) ) {// 取小数部分
      return NumberUtils.subtraction( num, Math.trunc( num ) );
    }
    return param;
  }
}
